見到坊間有很多中文教學都對Map的解釋不清楚及出現誤解,
所以想花些時間給大家清楚簡單地說明。
Map是Java的collections framework中的其中一類interface(介面),100%不是collection(集合),也不會inherit(繼承) Collection interface。所以不會extend Collection interface。
Map特點:
Implementation(實作)
有5個常用implementation(實作)的方式,分別是HashMap, TreeMap, WeakHashMap, EnumMap和 LinkedHashMap。
Subinterface(子介面)
有3個常用的subinterface(子介面),分別是SortedMap, NavigableMap, 和ConcurrentMap。
怎麼使用Map?
首先要import java.util.Map package,之後必須選擇一個合適的class來implement(實作) Map interface。
// 現在就隨意選一個,選HashMap class
Map<Key, Value> testingMap= new HashMap<>();
上面的一句就是創建一個新的Object(物件),名字叫testingMap,類別為Map。
另外,由於選擇HashMap class,可以自由使用HashMap的Method。
其實每個可以implement Map interface的class都有不同的功能,可以因應自己的需求去決定使用什麼class。
import java.util.Map;
import java.util.HashMap;
public class TestingMap {
public static void main(String[] args) {
// 選擇HashMap來創建新的Map物件
Map<String, Integer> testingMapObject = new HashMap<>();
// 新增元素(element)到Map物件 - testingMapObject
testingMapObject.put("One", 1);
testingMapObject.put("Two", 2);
// 列出testingMapObject內的所有key及對應的value
System.out.println("Map: " + testingMapObject);
// 列出testingMapObject內的所有key
System.out.println("Keys: " + testingMapObject.keySet());
// 列出testingMapObject內的所有value
System.out.println("Values: " + testingMapObject.values());
// 列出testingMapObject內的所有key及對應的value
System.out.println("Entries: " + testingMapObject.entrySet());
// 檢查testingMapObject內有沒有特定元素的key
System.out.println("Contain 2?: " + testingMapObject.containsKey("Two"));
// 刪除testingMapObject內的一個元素,然後把相對應的值列印出來
int value = testingMapObject.remove("Two");
System.out.println("Removed Value: " + value);
// 檢查testingMapObject內有沒有特定元素的key
System.out.println("Contain 2?: " + testingMapObject.containsKey("Two"));
// 檢查testingMapObject內有沒有特定元素的key
testingMapObject.putIfAbsent("One",2);
}
}
參考文章/網站/書本:
(注意,我所參考的文章有不同錯誤的地方,我只參考當中正確的部分)
Java Map Interface
文章內提到Map interface可以implement Collection interface是錯誤的
Why Map does not extend the Collection interface in Java Collections Framework?